/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jjsoft.celularessuc.gco.neg;


import com.jjsoft.celularessuc.gco.mdl.Articulo;
import com.jjsoft.celularessuc.gco.mdl.Configuracion;
import com.jjsoft.celularessuc.gco.mdl.Detalleproforma;
import com.jjsoft.celularessuc.gco.mdl.Factura;
import com.jjsoft.celularessuc.gco.mdl.Proforma;
import com.jjsoft.celularessuc.gco.mdl.Serviciotecnico;
import com.jjsoft.celularessuc.gco.util.CNumeros;
import com.jjsoft.celularessuc.gco.util.configuraciones;
import com.jjsoft.celularessuc.gco.util.printObject;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.AttributeSet;
import javax.print.attribute.HashAttributeSet;
import javax.swing.JOptionPane;

/**
 *
 * @author Johnny
 */
public class CImprimir
{
  public void imprimirFactura(Factura fact, List<Articulo> listaArticulos, String impresora)
  {
    /*DocFlavor docFormat = DocFlavor.SERVICE_FORMATTED.PRINTABLE;

    Doc document = new SimpleDoc(new printObject(fact, listaArticulos), docFormat, null);

    String printerName = impresora;

    PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
    int impr = 0;
    boolean existe = false;
    for (int i = 0; i < services.length; i++) {
      if (services[i].getName().equals(impresora)) {
        impr = i;
        existe = true;
      }
    }
    if (existe) {
      DocPrintJob printJob = services[impr].createPrintJob();
      try
      {
        printJob.print(document, null);
        System.out.print("imprimiendo en " + services[impr]);
      } catch (PrintException ex) {
        Logger.getLogger(CImprimir.class.getName()).log(Level.SEVERE, null, ex);
        ex.printStackTrace();
      }
    }
    else {
      JOptionPane.showMessageDialog(null, "No esta instalada la impresora seleccionada para la impresion. \n Por favor revise la impresora en las configuraciones");
    }*/
  }

  public void imprimirProforma(Proforma prof)
  {
    DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
    PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
    int impr = 0;
    boolean existe = false;
    for (int i = 0; i < services.length; i++) {
      if (services[i].getName().equals(configuraciones.getInstance().getConfiguracion().getImpresoraProforma())) {
        impr = i;
        existe = true;
      }
    }
    if (existe) {
      String ss = "=============== PROFORMA ===============";
      String num = AgregaEspacios("Numero: " + String.valueOf(prof.getNumero()));
      ss = ss + num;
      String local = AgregaEspacios(configuraciones.getInstance().getConfiguracion().getNombreLocal());
      ss = ss + local;
      String propietario = AgregaEspacios(configuraciones.getInstance().getConfiguracion().getNombreDuenio());
      ss = ss + propietario;
      String ruc = AgregaEspacios("RUC:" + configuraciones.getInstance().getConfiguracion().getRuc());
      ss = ss + ruc;
      String direccion = completaLineas("Direccion:" + configuraciones.getInstance().getConfiguracion().getDireccion());
      ss = ss + direccion;
      String telefono = AgregaEspacios("Telefono:" +configuraciones.getInstance().getConfiguracion().getTelefono());
      ss = ss + telefono;
      String fecha = AgregaEspacios("Fecha:" + prof.getFechaEmision().toLocaleString());
      ss = ss + fecha;
      String cliente = completaLineas("Cliente:" + prof.getCedulaCliente().getNombres() + " " + prof.getCedulaCliente().getApellidos());
      ss = ss + cliente;
      String ci = AgregaEspacios("CI/RUC:" + prof.getCedulaCliente().getCedula());
      ss = ss + ci;
      ss = ss + "----------------------------------------";
      ss = ss + "CANT  DESC                       V.VENTA";
      ss = ss + obtenDetalle(prof);
      ss = ss + "                                        ";
      ss = ss + "                                        ";
      ss = ss + "                                        ";
      ss = ss + "FIRMA__________________________________ ";
      ss = ss + "                                        ";
      ss = ss + "Info Sis: jonoavila2123@gmail.com       ";
      ss = ss + "          0995931355                    ";
      ss = ss + "                                        ";
      ss = ss + "                                        ";
      ss = ss + "                                        ";
      ss = ss + "                                        ";
      ss = ss + "                                        ";
      ss = ss + "                                        ";
      ss = ss + "                                       .\f";

      byte[] bytes = ss.getBytes();
      DocPrintJob printJob = services[impr].createPrintJob();
      Doc doc = new SimpleDoc(bytes, flavor, null);
      try
      {
        printJob.print(doc, null);
        System.out.print("imprimiendo en " + services[impr]);
      } catch (PrintException ex) {
        Logger.getLogger(CImprimir.class.getName()).log(Level.SEVERE, null, ex);
        ex.printStackTrace();
      }
    }
    else {
      JOptionPane.showMessageDialog(null, "No esta instalada la impresora seleccionada para la impresion. \n Por favor revise la impresora en las configuraciones");
    }
  }

  public String AgregaEspacios(String cadena) {
    for (int i = cadena.length(); i < 40; i++) {
      cadena = cadena + " ";
    }
    if (cadena.length() > 40) {
      cadena = cadena.substring(0, 39);
    }
    return cadena;
  }

  public String AgregaEspaciosDelante(String cadena) {
    for (int i = cadena.length(); i < 40; i++) {
      cadena = " " + cadena;
    }
    if (cadena.length() > 40) {
      cadena = cadena.substring(0, 40);
    }
    return cadena;
  }

  public String AgregaNEspacios(String cadena, int espacios)
  {
    for (int i = 0; i < espacios; i++) {
      cadena = cadena + " ";
    }
    return cadena;
  }

  public String obtenDetalle(Proforma prof) {
    String detalle = "";
    for (int i = 0; i < prof.getDetalleproformaList().size(); i++)
    {
      String articulo = "";
      String cant = String.valueOf(((Detalleproforma)prof.getDetalleproformaList().get(i)).getCantidad().intValue());
      cant = AgregaNEspacios(cant, 6 - cant.length());
      articulo = articulo + cant;
      String desc = prof.getDetalleproformaList().get(i).getIdArticulo().getDescripcion() + " " + prof.getDetalleproformaList().get(i).getIdArticulo().getMarca() + " " + prof.getDetalleproformaList().get(i).getIdArticulo().getModelo();
      if (desc.length() < 25)
      {
        desc = AgregaNEspacios(desc, 27 - desc.length());
      }
      else {
        desc = prof.getDetalleproformaList().get(i).getIdArticulo().getDescripcion().substring(0, 3).toUpperCase() + " " + prof.getDetalleproformaList().get(i).getIdArticulo().getMarca().substring(0, 3).toUpperCase() + " " + prof.getDetalleproformaList().get(i).getIdArticulo().getModelo().toUpperCase();
        desc = AgregaNEspacios(desc, 27 - desc.length());
      }
      articulo = articulo + desc;
      String valor = String.valueOf (CNumeros.redondear(((Detalleproforma)prof.getDetalleproformaList().get(i)).getCantidad().intValue() * ((Detalleproforma)prof.getDetalleproformaList().get(i)).getPrecioVenta().doubleValue()));
      valor = AgregaNEspacios(valor, 7 - valor.length());
      articulo = articulo + valor;
      if ((((Detalleproforma)prof.getDetalleproformaList().get(i)).getSerie() != null) && (((Detalleproforma)prof.getDetalleproformaList().get(i)).getSerie().length() > 0))
      {
        articulo = articulo + "      SN:" + AgregaNEspacios(((Detalleproforma)prof.getDetalleproformaList().get(i)).getSerie(), 31 - ((Detalleproforma)prof.getDetalleproformaList().get(i)).getSerie().length());
      }
      detalle = detalle + articulo;
    }
    detalle = detalle + "----------------------------------------";
    double subt = (prof.getDescuento().doubleValue() / 100.0D + 1.0D) * prof.getTotal().doubleValue() - prof.getIva().doubleValue();
    double descuento = subt * prof.getDescuento().doubleValue();
    String subtotal = AgregaEspaciosDelante("Subtotal: " + CNumeros.redondear(subt));
    detalle = detalle + subtotal;
    String desc = AgregaEspaciosDelante("Descuento: " + CNumeros.redondear(descuento));
    detalle = detalle + desc;
    String iva = AgregaEspaciosDelante("IVA: " + CNumeros.redondear(prof.getIva().doubleValue()));
    detalle = detalle + iva;
    String total = AgregaEspaciosDelante("Total: " + CNumeros.redondear(prof.getTotal().doubleValue()));
    detalle = detalle + total;

    return detalle;
  }

  public void imprimirServicioTecnico(Serviciotecnico serv, int numero, String impresora)
  {
    DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
    PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
    int impr = 0;
    boolean existe = false;
    for (int i = 0; i < services.length; i++) {
      if (services[i].getName().equals(impresora)) {
        impr = i;
        existe = true;
      }
    }
    if (existe) {
      String ss = "===== SOLICITUD DE SERVICIO TECNICO ====";
      String num = AgregaEspacios("Numero: " + String.valueOf(numero));
      ss = ss + num;
      String local = AgregaEspacios(configuraciones.getInstance().getConfiguracion().getNombreLocal());
      ss = ss + local;
      String propietario = AgregaEspacios(configuraciones.getInstance().getConfiguracion().getNombreDuenio());
      ss = ss + propietario;
      String ruc = AgregaEspacios("RUC:" + configuraciones.getInstance().getConfiguracion().getRuc());
      ss = ss + ruc;
      String direccion = completaLineas("Direccion:" + configuraciones.getInstance().getConfiguracion().getDireccion());
      ss = ss + direccion;
      String telefono = AgregaEspacios("Telefono:" + configuraciones.getInstance().getConfiguracion().getTelefono());
      ss = ss + telefono;
      String fecha = AgregaEspacios("Fecha:" + serv.getFecha().getDate() + "/" + (serv.getFecha().getMonth() + 1) + "/" + (serv.getFecha().getYear() + 1900));
      ss = ss + fecha;
      String cliente = completaLineas("Cliente:" + serv.getCedulaCliente().getNombres() + " " + serv.getCedulaCliente().getApellidos());
      ss = ss + cliente;
      String ci = AgregaEspacios("CI/RUC:" + serv.getCedulaCliente().getCedula());
      ss = ss + ci;
      ss = ss + "----------------------------------------";
      String datos = completaLineas("Datos del equipo: " + serv.getDatos().trim());
      ss = ss + datos;
      String numSer = AgregaEspacios("Numero/Serie: " + serv.getNumeroSerie().trim());
      ss = ss + numSer;
      String chip = AgregaEspacios("Chip: " + serv.getChip().trim());
      ss = ss + chip;
      String memoria = AgregaEspacios("Memoria: " + serv.getMemoria().trim());
      ss = ss + memoria;
      String fallo = completaLineas("Fallo Reportado: " + serv.getFallo().trim());
      ss = ss + fallo;
      String obser = completaLineas("Observaciones: " + serv.getObservaciones().trim());
      ss = ss + obser;
      ss = ss + "----------------------------------------";
      String mensaje = "";
      mensaje = mensaje + AgregaEspacios("LEA ESTO ES IMPORTANTE: ");
      mensaje = mensaje + completaLineas("*El costo de revision del equipo es de 4 dolares americanos");
      mensaje = mensaje + completaLineas("*Me comprometo a cancelar hasta un valor de 25 dolares por la reparacion de mi equipo sin previa notificacion");
      mensaje = mensaje + completaLineas(new StringBuilder().append("*Si el equipo no es retirado en 30 dias a partir de la fecha de ingreso, seran considerados en abandono y ").append(configuraciones.getInstance().getConfiguracion().getNombreLocal().toUpperCase()).append(" procedera al remate del equipo para cubrir gastos de operacion").toString());
      mensaje = mensaje + completaLineas("*La garantia de reparacion sobre el fallo es de 30 dias; los equipos mojados, reinstalados el sistema operativo, flasheados, con virus informatico, o software, no aplica garantia");
      ss = ss + mensaje;
      ss = ss + "                                        ";
      ss = ss + "                                        ";
      ss = ss + "                                        ";
      ss = ss + "                                        ";
      ss = ss + "Firma_________________________________  ";
      ss = ss + AgregaEspacios(new StringBuilder().append("Fecha: ").append(serv.getFecha().getDate()).append("/").append(serv.getFecha().getMonth() + 1).append("/").append(serv.getFecha().getYear() + 1900).toString());
      ss = ss + "                                        ";
      ss = ss + "Info Sis: jonoavila2123@gmail.com       ";
      ss = ss + "          0995931355                    ";
      ss = ss + "                                        ";
      ss = ss + "                                        ";
      ss = ss + "                                        ";
      ss = ss + "                                        ";
      ss = ss + "                                        ";
      ss = ss + "                                       .\f";
      ss = ss.trim();
      byte[] bytes = ss.getBytes();
      DocPrintJob printJob = services[impr].createPrintJob();
      Doc doc = new SimpleDoc(bytes, flavor, null);
      try
      {
        printJob.print(doc, null);
        System.out.print("imprimiendo en " + services[impr]);
      } catch (PrintException ex) {
        Logger.getLogger(CImprimir.class.getName()).log(Level.SEVERE, null, ex);
        ex.printStackTrace();
      }
    }
    else {
      JOptionPane.showMessageDialog(null, "No esta instalada la impresora seleccionada para la impresion. \n Por favor revise la impresora en las configuraciones");
    }
  }

  public String completaLineas(String cadena) {
    int espacios = cadena.length() % 40;
    if (espacios > 0)
    {
      espacios = 40 - espacios;
      for (int i = 0; i < espacios; i++)
      {
        cadena = cadena + " ";
      }
    }
    return cadena;
  }
  public List<String> getImpresoras() {
    List impresoras = new ArrayList();
    DocFlavor docFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
    AttributeSet attributeSet = new HashAttributeSet();
    PrintService[] services = PrintServiceLookup.lookupPrintServices(docFormat, attributeSet);
    int impr = 0;
    for (int i = 0; i < services.length; i++) {
      impresoras.add(services[i].getName());
    }

    return impresoras;
  }
}